home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / openwebmail_detect.nasl < prev    next >
Text File  |  2005-03-31  |  7KB  |  199 lines

  1. #
  2. # This script was written by George A. Theall, <theall@tifaware.com>.
  3. #
  4. # See the Nessus Scripts License for details.
  5. #
  6.  
  7.  
  8. # NB: I define the script description here so I can later modify
  9. #     it with the version number and install directory.
  10.   desc["english"] = "
  11. This script detects whether the target is running Open WebMail and
  12. extracts version numbers and locations of any instances found. 
  13.  
  14. Open WebMail is a webmail package written in Perl that provides access
  15. to mail accounts via POP3 or IMAP.  See <http://www.openwebmail.org/>
  16. for more information.";
  17.  
  18.  
  19. if (description) {
  20.   script_id(14221);
  21.   script_version ("$Revision: 1.9 $"); 
  22.  
  23.   name["english"] = "Open WebMail Detection";
  24.   script_name(english:name["english"]);
  25.  
  26.   script_description(english:desc["english"]);
  27.  
  28.   summary["english"] = "Checks for the presence of Open WebMail";
  29.   script_summary(english:summary["english"]);
  30.  
  31.   script_category(ACT_GATHER_INFO);
  32.   script_copyright(english:"This script is Copyright (C) 2004 George A. Theall");
  33.  
  34.   family["english"] = "General";
  35.   script_family(english:family["english"]);
  36.  
  37.   script_dependencie("global_settings.nasl", "http_version.nasl", "no404.nasl");
  38.   script_require_ports("Services/www", 80);
  39.  
  40.   exit(0);
  41. }
  42.  
  43. include("global_settings.inc");
  44. include("http_func.inc");
  45. include("http_keepalive.inc");
  46.  
  47. host = get_host_name();
  48. port = get_http_port(default:80);
  49.  
  50. if (!get_port_state(port)) exit(0);
  51. if (get_kb_item("www/no404/" + port)) exit(0);
  52. if (debug_level) display("debug: looking for Open WebMail on ", host, ":", port, ".\n");
  53.  
  54. # Search for Open WebMail in a couple of different locations.
  55. #
  56. # NB: Directories beyond cgi_dirs() come from a Google search - 
  57. #     'inurl:openwebmail.pl userid' - and represent the more popular
  58. #     installation paths currently. Still, cgi_dirs() should catch
  59. #     the directory if its referenced elsewhere on the target.
  60. dirs = make_list(cgi_dirs());
  61. xtra_dirs = make_array(
  62.   "/cgi-bin/openwebmail", 1,
  63.   "/openwebmail-cgi", 1
  64. );
  65. foreach dir (dirs) {
  66.   # Set value to zero if it's already in dirs.
  67.   if (!isnull(xtra_dirs[dir])) xtra_dirs[dir] = 0;
  68. }
  69. foreach dir (keys(xtra_dirs)) {
  70.   # Add it to dirs if the value is still set.
  71.   if (xtra_dirs[dir]) dirs = make_list(dirs, dir);
  72. }
  73.  
  74. installs = 0;
  75. foreach dir (dirs) {
  76.   url = string(dir, "/openwebmail.pl");
  77.   if (debug_level) display("debug: retrieving ", url, "...\n");
  78.   req = http_get(item:url, port:port);
  79.   res = http_keepalive_send_recv(port:port, data:req);
  80.   if (isnull(res)) exit(0);             # can't connect
  81.   if (debug_level) display("debug: res =>>", res, "<<\n");
  82.  
  83.   # If the page refers to Open WebMail, try to get its version number.
  84.   if (
  85.     egrep(string:res, pattern:"^HTTP/.* 200 OK") &&
  86.     egrep(string:res, pattern:"(http://openwebmail\.org|Open WebMail)")
  87.   ) {
  88.     # First see if version's included in the form. If it is, Open WebMail 
  89.     # puts it on a line by itself, prefixed by the word "version".
  90.     pat = "^version (.+)$";
  91.     if (debug_level) display("debug: grepping results for =>>", pat, "<<\n");
  92.     matches = egrep(pattern:pat, string:res);
  93.     foreach match (split(matches)) {
  94.       match = chomp(match);
  95.       if (debug_level) display("debug: grepping >>", match, "<< for =>>", pat, "<<\n");
  96.       ver = eregmatch(pattern:pat, string:match);
  97.       if (!isnull(ver)) ver = ver[1];
  98.       break;                            # nb: only worried about first match.
  99.     }
  100.  
  101.     # If that didn't work, looking for it in doc/changes.txt,
  102.     # under the Open WebMail data directory.
  103.     if (isnull(ver)) {
  104.       # Identify data directory from links to images or help files.
  105.       pat = '([^\'"]*/openwebmail)/(images|help)/';
  106.       if (debug_level) display("debug: grepping results for =>>", pat, "<<\n");
  107.       matches = egrep(pattern:pat, string:res);
  108.       foreach match (split(matches)) {
  109.         match = chomp(match);
  110.         if (debug_level) display("debug: grepping >>", match, "<< for =>>", pat, "<<\n");
  111.         data_url = eregmatch(string:match, pattern:pat);
  112.         if (!isnull(data_url)) data_url = data_url[1];
  113.         break;                          # nb: only worried about first match.
  114.       }
  115.       # Try to get doc/changes.txt under data directory.
  116.       if (!isnull(data_url)) {
  117.         if (debug_level) display("debug: url for data files =>>", data_url, "<<\n");
  118.         url = string(data_url, "/doc/changes.txt");
  119.         if (debug_level) display("debug: retrieving ", url, "...\n");
  120.         req = http_get(item:url, port:port);
  121.         res = http_keepalive_send_recv(port:port, data:req);
  122.         if (isnull(res)) exit(0);       # can't connect
  123.         if (debug_level) display("debug: res =>>", res, "<<\n");
  124.  
  125.         # Try to get version number.
  126.         #
  127.         # nb: this won't identify intermediate releases, only full ones.
  128.         if (egrep(string:res, pattern:"^HTTP/.* 200 OK")) {
  129.           pat = "^[0-1][0-9]/[0-3][0-9]/20[0-9][0-9]( +.version .+)?";
  130.           if (debug_level) display("debug: grepping results for =>>", pat, "<<\n");
  131.           matches = egrep(pattern:pat, string:res);
  132.           foreach match (split(matches)) {
  133.             match = chomp(match);
  134.             if (debug_level) display("debug: grepping >>", match, "<< for =>>", pat, "<<\n");
  135.             ver = eregmatch(pattern:"version +(.+).$", string:match);
  136.             if (isnull(ver)) {
  137.               # nb: only first release date matters.
  138.               if (isnull(rel)) {
  139.                 # Rearrange date: mm/dd/yyyy -> yyyyddmm.
  140.                 parts = split(match, sep:"/", keep:FALSE);
  141.                 rel = string(parts[2], parts[0], parts[1]);
  142.               }
  143.             }
  144.             else {
  145.               ver = ver[1];
  146.               if (!isnull(rel)) ver = string(ver, " ", rel);
  147.               break;                    # nb: only worried about first match.
  148.             }
  149.           }
  150.         }
  151.       }
  152.     }
  153.  
  154.     # nb: in the event the version number is still unknown, I want 
  155.     #     to record the fact that there's *some* version installed.
  156.     if (isnull(ver)) {
  157.       ver = "*** VERSION UNKNOWN ***";
  158.       if (log_verbosity > 1) display("Can't determine version of Open WebMail installed under ", dir, " on ", host, ":", port, "!\n");
  159.     }
  160.  
  161.     if (debug_level) display("debug: Open WebMail version =>>", ver, "<<\n");
  162.     set_kb_item(
  163.       name:string("www/", port, "/openwebmail"), 
  164.       value:string(ver, " under ", dir)
  165.     );
  166.     installations[dir] = ver;
  167.     ++installs;
  168.   }
  169.   # Scan for multiple installations only if "Thorough Tests" is checked.
  170.   if (installs && !thorough_tests) break;
  171. }
  172.  
  173. # Report any instances found unless Report verbosity is "Quiet".
  174. if (installs && report_verbosity > 0) {
  175.   if (installs == 1) {
  176.     foreach dir (keys(installations)) {
  177.       # empty - just need to set 'dir'.
  178.     }
  179.     info = string("Open WebMail ", ver, " was detected on the remote host under the path ", dir, ".");
  180.   }
  181.   else {
  182.     info = string(
  183.       "Multiple instances of Open WebMail were detected on the remote host:\n",
  184.       "\n"
  185.     );
  186.     foreach dir (keys(installations)) {
  187.       info = info + string("    ", installations[dir], ", installed under ", dir, "\n");
  188.     }
  189.     info = chomp(info);
  190.   }
  191.  
  192.   desc = ereg_replace(
  193.     string:desc["english"],
  194.     pattern:"This script[^\.]+\.", 
  195.     replace:info
  196.   );
  197.   security_note(port:port, data:desc);
  198. }
  199.